/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package beans;

import bc.ProductoSbsDelegate;
import bc.SolicitudCreditoDelegate;
import edu.upn.sigemfi.sac.be.Documento;
import edu.upn.sigemfi.sac.be.DocumentoPresentado;
import edu.upn.sigemfi.sac.be.DocumentoPresentadoPK;
import edu.upn.sigemfi.sac.be.EstadoDocumento;
import edu.upn.sigemfi.sac.be.EstadoSolicitudCredito;
import edu.upn.sigemfi.sac.be.HojaRuta;
import edu.upn.sigemfi.sac.be.ProductoSbs;
import edu.upn.sigemfi.sac.be.SolicitudCredito;
import edu.upn.sigemfi.sac.be.SubProducto;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.model.SelectItem;

/**
 *
 * @author Programador
 */
public class SolicitudCreditoController extends AbstractController {
    private SolicitudCreditoDelegate delegado;
    private SolicitudCredito solicitudCredito;
    private ProductoSbsDelegate productoSBSDelegado;
    private ProductoSbs productoSBS;
    private SubProducto subProducto;
    private HojaRuta puntoARestaurar;
    private HojaRuta hojaRuta;
    private Documento doc;
    private DocumentoPresentado docPre;


    private List<EstadoDocumento> estadosDocs;
    private List<EstadoSolicitudCredito> estados;

    public Documento getDoc() {
        return doc;
    }

    public void setDoc(Documento doc) {
        this.doc = doc;
    }

    public DocumentoPresentado getDocPre() {
        return docPre;
    }

    public void setDocPre(DocumentoPresentado docPre) {
        this.docPre = docPre;
    }



    public HojaRuta getPuntoARestaurar() {
        return puntoARestaurar;
    }

    public void setPuntoARestaurar(HojaRuta puntoARestaurar) {
        this.puntoARestaurar = puntoARestaurar;
    }



    public HojaRuta getHojaRuta() {
        return hojaRuta;
    }

    public void setHojaRuta(HojaRuta hojaRuta) {
        this.hojaRuta = hojaRuta;
    }

    public SubProducto getSubProducto() {
        return subProducto;
    }

    public void setSubProducto(SubProducto subProducto) {
        this.subProducto = subProducto;
    }


    public ProductoSbs getProductoSBS() {
        return productoSBS;
    }

    public void setProductoSBS(ProductoSbs productoSBS) {
        this.productoSBS = productoSBS;
    }



    public SolicitudCreditoController() {
        delegado = new SolicitudCreditoDelegate();
        productoSBSDelegado = new ProductoSbsDelegate();
        try {
            estadosDocs = delegado.getEstadosDocumentos();

            estados = delegado.getEstadosSolicitud();
        } catch (Exception e) {
            mostrarError(e.getMessage());
        }
    }

    public String nuevo(){
        solicitudCredito = new SolicitudCredito();
        hojaRuta = new HojaRuta();
        return "nuevo";
    }

    public String buscarCliente(){
        solicitudCredito = new SolicitudCredito();
        return "";
    }

    public String consultarSolicitudesParaAprobar(){

        solicitudCredito = new SolicitudCredito();
        return "evaluarAutonomia";
    }

    public String evaluarSolicitudAAprobar(){
        hojaRuta = new HojaRuta();
        return "evaluarAutonomia";
    }

    public List<SolicitudCredito> getSolicitudesAAprobar(){
        List<SolicitudCredito> solicitudes = null;
        try {
            solicitudes = delegado.buscarEstadoSolicitud(3L).getSolicitudCreditoCollection();

        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        return solicitudes;
    }

/*
    public SelectItem[] getProductos(){
        SelectItem[] selects = null;
        try {
            productos = productoSBSDelegado.getProductosSBS();
            selects = new SelectItem[productos.size() + 1];
            int i = 0;
            selects[i++] = new SelectItem(null, "Seleccione un Producto");
            for (ProductoSbs p : productos) {
                selects[i++] = new SelectItem(p.getIdProductoSbs(), p.getNombre());
            }
        } catch (Exception e) {
            selects = new SelectItem[1];
            selects[0] = new SelectItem(null, "Error al momento de consultar los datos");
            System.out.println(e.getMessage());
            mostrarError(e.getMessage());
        }
        return selects;
    }
*/

    // ********** Metodos y propiedades **************//

    public SelectItem[] getSubProductos(){
        SelectItem[] selects = null;
        try {
            if (productoSBS != null) {
                //List<SubProducto> subs =  productoSBSDelegado.getSubProductos(productoSBS.getIdProductoSbs());
                //productoSBS.setSubProductoCollection(subs);
                List<SubProducto> subs = productoSBS.getSubProductoCollection();
                if (productoSBS.getSubProductoCollection() != null) {
                    selects = new SelectItem[subs.size() + 1];
                    int i = 0;
                    selects[i++] = new SelectItem(null, "Seleccione un SubTipo de Credito");
                    for (SubProducto sb : productoSBS.getSubProductoCollection()) {
                        selects[i++] = new SelectItem(sb, sb.getNombre());
                    }
                } else {
                    selects = new SelectItem[1];
                    selects[0] = new SelectItem(null, "El Tipo de Credito no tiene Subtipos registrados");
                }
            } else {
                selects = new SelectItem[1];
                selects[0] = new SelectItem(null, "Seleccione un Subtipo de Credito");
            }
        } catch (Exception e) {
            selects = new SelectItem[1];
            selects[0] = new SelectItem(null, "Error al momento de consultar los datos");
            mostrarError(e.getMessage());
        }
        return selects;

    }

    public String aprobarAutonomia(){
        
        try {

            EstadoSolicitudCredito estado = solicitudCredito.getFidSacEstadoSolicitudCredito();
            estado.getSolicitudCreditoCollection().remove(solicitudCredito);
            solicitudCredito.setFidSacEstadoSolicitudCredito(delegado.buscarEstadoSolicitud(4L));
            
            agregarHojaRuta();

            delegado.editar(solicitudCredito);
            
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        return "regresar";
    }

    public String registrar(){

        try{
            List<DocumentoPresentado> docs = new ArrayList<DocumentoPresentado>();
            List<Documento> docus = solicitudCredito.getFidSacSubProducto().getDocumentoCollection();
            Short Obli = 1;

            solicitudCredito.setFidSacEstadoSolicitudCredito(delegado.buscarEstadoSolicitud(1L));
            solicitudCredito.setFechaRegistro(new Date());
            delegado.crear(solicitudCredito);
            
            for(Documento d : docus){
                DocumentoPresentado dp = new DocumentoPresentado();
                DocumentoPresentadoPK dpPk = new DocumentoPresentadoPK();
                dpPk.setFidSacDocumento(d.getIdDocumento());
                dpPk.setFidSacSolicitudCredito(solicitudCredito.getIdSolicitudcredito());
                dp.setDocumentoPresentadoPK(dpPk);
                dp.setDocumento(d);
                dp.setFidSacEstadoDocumento(delegado.buscarEstadoDocumento(1L));
                dp.setObligatorio(Obli);
                dp.setSolicitudCredito(solicitudCredito);

                docs.add(dp);
            }

            solicitudCredito.setFidSacEstadoSolicitudCredito(delegado.buscarEstadoSolicitud(2L));
            solicitudCredito.setDocumentoPresentadoCollection(docs);
            
            agregarHojaRuta();

            delegado.editar(solicitudCredito);
            
        }catch(Exception e){
                e.printStackTrace();
                mostrarError(e.getMessage());
        }
        return "nuevaSolicitud";
    }


     public String solicitudPendiente(){
        solicitudCredito = null;
        return "irBuscar";
    }


    public String buscarSolicitud(){
        try {
            // BUSCAR CLIENTE

            solicitudCredito = delegado.buscar(4L);
            
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        return "";
    }

    public String tramitar(){
        return "editar";
    }
    
    public SolicitudCredito getSolicitudCredito() {
        return solicitudCredito;
    }

    public void setSolicitudCredito(SolicitudCredito solicitudCredito) {
        this.solicitudCredito = solicitudCredito;
    }

    public String getStringInteres(){
        
        Double interes = solicitudCredito.getFidSacSubProducto().getTasaInteresVencido()*100;
        return interes.toString() + "%";
    }

    public String desaprobarAutonomia(){
        try {
            solicitudCredito.setFidSacEstadoSolicitudCredito(delegado.buscarEstadoSolicitud(6L));
            agregarHojaRuta();
            delegado.editar(solicitudCredito);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }

        return "terminar";
    }

    private void agregarHojaRuta(){

        if(solicitudCredito.getHojaRutaCollection() == null){
            solicitudCredito.setHojaRutaCollection(new ArrayList<HojaRuta>());
        }
        hojaRuta.setFidSacEstadoSolicitudCredito(solicitudCredito.getFidSacEstadoSolicitudCredito());
        hojaRuta.setFidSacSolicitudCredito(solicitudCredito);
        hojaRuta.setFecha(new Date());
        solicitudCredito.getHojaRutaCollection().add(hojaRuta);
    }

    public List<SolicitudCredito> getSolicitudesExtornadas(){
        List<SolicitudCredito> solicitudes = null;
        try {
            solicitudes = delegado.buscarEstadoSolicitud(6L).getSolicitudCreditoCollection();

        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        return solicitudes;
    }


    public String verRutaCrediticia(){
        return "ver";
    }

    public String irRestaurar(){
        hojaRuta = new HojaRuta();
        return "restaurar";
    }

    public String restaurarCredito(){

        try {
            if(solicitudCredito.getFidSacEstadoSolicitudCredito().getIdEstadoSolicitudCredito() != puntoARestaurar.getFidSacEstadoSolicitudCredito().getIdEstadoSolicitudCredito()){
                solicitudCredito.setFidSacEstadoSolicitudCredito(puntoARestaurar.getFidSacEstadoSolicitudCredito());
                agregarHojaRuta();

                // Reactivar Solicitantes
                // Reasociar Garantias

                delegado.editar(solicitudCredito);
            }

        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }


        return "terminar";
    }

    private void extornarCredito(){
        //Liberar Garancias
        //Desactivar Solicitantes

    }

    // ********** Metodos y propiedades **************//

    public SelectItem[] getEstadosDocumentos() {

        SelectItem[] selects = null;
        try {
            selects = new SelectItem[estadosDocs.size()];
            int i = 0;
            for (EstadoDocumento es : estadosDocs) {
                selects[i++] = new SelectItem(es, es.getNombre());
            }
        } catch (Exception e) {
            selects = new SelectItem[1];
            selects[0] = new SelectItem(null, "Error al momento de consultar estados de documentos");
            System.out.println(e.getMessage());
            mostrarError(e.getMessage());
        }
        return selects;
    }

    public String verExpediente(){

        return "verExpediente";
    }

    public String agregarDocAdicional(){

        doc = new Documento();
        docPre = new DocumentoPresentado();
        return "docAdicional";
    }

    public String regDocAdicional(){
        try {
            productoSBSDelegado.crearDocumento(doc);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
            mostrarError(ex.getMessage());
        }
        Short Obli = 0;
        DocumentoPresentadoPK dpPk = new DocumentoPresentadoPK();
        docPre.setDocumento(doc);
        docPre.setSolicitudCredito(solicitudCredito);
        
        dpPk.setFidSacDocumento(doc.getIdDocumento());
        dpPk.setFidSacSolicitudCredito(solicitudCredito.getIdSolicitudcredito());
        docPre.setDocumentoPresentadoPK(dpPk);

        docPre.setObligatorio(Obli);
        solicitudCredito.getDocumentoPresentadoCollection().add(docPre);

        return "volver";
    }


    public String actualizarExpediente(){
        try {

            for(DocumentoPresentado dpre: solicitudCredito.getDocumentoPresentadoCollection()){
                if(dpre.getFechaPresentacion()==null){
                    dpre.setFechaPresentacion(new Date());
                }
            }
            delegado.editar(solicitudCredito);
        } catch (Exception ex) {
            Logger.getLogger(SolicitudCreditoController.class.getName()).log(Level.SEVERE, null, ex);
        }



        return "volver";
    }
}
